package com.example.pay.util;

import net.sf.json.JSONObject;
import org.apache.commons.codec.binary.Base64;


/**
 * @Author: Wu YunXia
 * @Description:
 * @Date: Created in 15:25 2020/12/4
 * @Modefied By:
 */



/**
 * AES加密
 *
 *
 */
public class AesCbcUtil {

    private static final String WATERMARK = "watermark";
    private static final String APPID = "appid";
    /**
     * 解密数据
     * @return
     * @throws Exception
     */
    public static String decrypt(String appId, String encryptedData, String sessionKey, String iv){
        String result = "";
        try {
            AES aes = new AES();
            byte[] resultByte = aes.decrypt(Base64.decodeBase64(encryptedData), Base64.decodeBase64(sessionKey), Base64.decodeBase64(iv));
            if(null != resultByte && resultByte.length > 0){
                result = new String(WxPKCS7Encoder.decode(resultByte));
                JSONObject jsonObject = JSONObject.fromObject(result);
                String decryptAppid = jsonObject.getJSONObject(WATERMARK).getString(APPID);
                if(!appId.equals(decryptAppid)){
                    result = "";
                }
            }
        } catch (Exception e) {
            result = "";
            e.printStackTrace();
        }
        return result;
    }


//    public static void main(String[] args) throws Exception{
//        String appId = "wx4f4bc4dec97d474b";
//        String encryptedData = "CiyLU1Aw2KjvrjMdj8YKliAjtP4gsMZMQmRzooG2xrDcvSnxIMXFufNstNGTyaGS9uT5geRa0W4oTOb1WT7fJlAC+oNPdbB+3hVbJSRgv+4lGOETKUQz6OYStslQ142dNCuabNPGBzlooOmB231qMM85d2/fV6ChevvXvQP8Hkue1poOFtnEtpyxVLW1zAo6/1Xx1COxFvrc2d7UL/lmHInNlxuacJXwu0fjpXfz/YqYzBIBzD6WUfTIF9GRHpOn/Hz7saL8xz+W//FRAUid1OksQaQx4CMs8LOddcQhULW4ucetDf96JcR3g0gfRK4PC7E/r7Z6xNrXd2UIeorGj5Ef7b1pJAYB6Y5anaHqZ9J6nKEBvB4DnNLIVWSgARns/8wR2SiRS7MNACwTyrGvt9ts8p12PKFdlqYTopNHR1Vf7XjfhQlVsAJdNiKdYmYVoKlaRv85IfVunYzO0IKXsyl7JCUjCpoG20f0a04COwfneQAGGwd5oa+T8yO5hzuyDb/XcxxmK01EpqOyuxINew==";
//        String sessionKey = "tiihtNczf5v6AKRyjwEUhQ==";
//        String iv = "r7BXXKkLb8qrSNn05n0qiA==";
//        System.out.println(decrypt(appId, encryptedData, sessionKey, iv));
//    }

////算法名
//private static final String KEY_ALGORITHM = "AES";
////填充
//private static final String ALGORITHM_STR = "AES/CBC/PKCS7Padding";
////密钥格式
//private static Key key;
//private static Cipher cipher;
//
////将传递过来的数据 用base64先行解密
//public static String decryptNew(String encryptDataB64, String sessionKeyB64, String ivB64) {
//    return new String(
//            decryptOfDiyIV(
//                    Base64.decode(encryptDataB64),
//                    Base64.decode(sessionKeyB64),
//                    Base64.decode(ivB64)
//            )
//    );
//}
//
//
//private static void init(byte[] keyBytes) {
//    // 如果密钥不足16位，那么就补足.  这个if 中的内容很重要
//    int base = 16;
//    if (keyBytes.length % base != 0) {
//        int groups = keyBytes.length / base + (keyBytes.length % base != 0 ? 1 : 0);
//        byte[] temp = new byte[groups * base];
//        Arrays.fill(temp, (byte) 0);
//        System.arraycopy(keyBytes, 0, temp, 0, keyBytes.length);
//        keyBytes = temp;
//    }
//    // 初始化
//    Security.addProvider(new BouncyCastleProvider());
//    // 转化成JAVA的密钥格式
//    key = new SecretKeySpec(keyBytes, KEY_ALGORITHM);
//    try {
//        // 初始化cipher
//        cipher = Cipher.getInstance(ALGORITHM_STR, "BC");
//    } catch (Exception e) {
//        e.printStackTrace();
//    }
//}
//
///**
// * 解密方法
// * @param encryptedData 要解密的字符串
// * @param keyBytes      解密密钥
// * @param ivs           自定义对称解密算法初始向量 iv
// * @return 解密后的字节数组
// */
//private static byte[] decryptOfDiyIV(byte[] encryptedData, byte[] keyBytes, byte[] ivs) {
//    byte[] encryptedText = null;
//    init(keyBytes);
//    try {
//        cipher.init(Cipher.DECRYPT_MODE, key, new IvParameterSpec(ivs));
//        encryptedText = cipher.doFinal(encryptedData);
//    } catch (Exception e) {
//        e.printStackTrace();
//    }
//    return encryptedText;
//}


//public static String decryptNew(String encryptedData, String sessionKey, String iv){
//    // 被加密的数据
//    byte[] dataByte = Base64.decode(encryptedData);
//    // 加密秘钥
//    byte[] keyByte = Base64.decode(sessionKey);
//    // 偏移量
//    byte[] ivByte = Base64.decode(iv);
//
//    try {
//        // 如果密钥不足16位，那么就补足.  这个if 中的内容很重要
//        int base = 16;
//        if (keyByte.length % base != 0) {
//            int groups = keyByte.length / base + (keyByte.length % base != 0 ? 1 : 0);
//            byte[] temp = new byte[groups * base];
//            Arrays.fill(temp, (byte) 0);
//            System.arraycopy(keyByte, 0, temp, 0, keyByte.length);
//            keyByte = temp;
//        }
//
//
//        // 初始化
//        Security.addProvider(new BouncyCastleProvider());
//        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding","BC");
//        SecretKeySpec spec = new SecretKeySpec(keyByte, "AES");
//        AlgorithmParameters parameters = AlgorithmParameters.getInstance("AES");
//        parameters.init(new IvParameterSpec(ivByte));
//        cipher.init(Cipher.DECRYPT_MODE, spec, parameters);// 初始化
//        byte[] resultByte = cipher.doFinal(dataByte);
//        if (null != resultByte && resultByte.length > 0) {
//            String result = new String(resultByte, "UTF-8");
//            return result;
//        }
//    } catch (Exception e) {
//        e.printStackTrace();
//    }
//    return null;
//}




//public static String decryptNew(String encryptedData, String sessionKey, String iv) throws Exception {
//    String result = "";
//    // 被加密的数据
//    byte[] dataByte = Base64.decode(encryptedData);
//    // 加密秘钥
//    byte[] keyByte = Base64.decode(sessionKey);
//    // 偏移量
//    byte[] ivByte = Base64.decode(iv);
//    try {
//        // 如果密钥不足16位，那么就补足. 这个if 中的内容很重要
//        int base = 16;
//        if (keyByte.length % base != 0) {
//            int groups = keyByte.length / base + (keyByte.length % base != 0 ? 1 : 0);
//            byte[] temp = new byte[groups * base];
//            Arrays.fill(temp, (byte) 0);
//            System.arraycopy(keyByte, 0, temp, 0, keyByte.length);
//            keyByte = temp;
//        }
//        // 初始化
//        Security.addProvider(new BouncyCastleProvider());
//        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding", "BC");
//        SecretKeySpec spec = new SecretKeySpec(keyByte, "AES");
//        AlgorithmParameters parameters = AlgorithmParameters.getInstance("AES");
//        parameters.init(new IvParameterSpec(ivByte));
//        // 初始化
//        cipher.init(Cipher.DECRYPT_MODE, spec, parameters);
//        byte[] resultByte = cipher.doFinal(dataByte);
//        if (null != resultByte && resultByte.length > 0) {
//            result = new String(resultByte, "UTF-8");
//        }
//    } catch (NoSuchAlgorithmException e) {
////        LOGGER.error(e.getMessage(), e);
//    } catch (NoSuchPaddingException e) {
////        LOGGER.error(e.getMessage(), e);
//    } catch (InvalidParameterSpecException e) {
////        LOGGER.error(e.getMessage(), e);
//    } catch (IllegalBlockSizeException e) {
////        LOGGER.error(e.getMessage(), e);
//    } catch (BadPaddingException e) {
////        LOGGER.error(e.getMessage(), e);
//    } catch (UnsupportedEncodingException e) {
////        LOGGER.error(e.getMessage(), e);
//    } catch (InvalidKeyException e) {
////        LOGGER.error(e.getMessage(), e);
//    } catch (InvalidAlgorithmParameterException e) {
////        LOGGER.error(e.getMessage(), e);
//    } catch (NoSuchProviderException e) {
////        LOGGER.error(e.getMessage(), e);
//    }
//
//    System.out.println("result:"+result);
//    return result;
//}



//public static String decryptNew(String encryptedData, String sessionKey, String iv) throws Exception {
//        String result = "";
//    // 被加密的数据
//    byte[] dataByte = Base64.decode(encryptedData);
//
//    // 加密秘钥
//    byte[] keyByte = Base64.decode(sessionKey);
//    // 偏移量
//    byte[] ivByte = Base64.decode(iv);
//    try {
//        System.out.println("进了");
//        // 如果密钥不足16位，那么就补足. 这个if 中的内容很重要
//        int base = 16;
//        if (keyByte.length % base != 0) {
//            int groups = keyByte.length / base + (keyByte.length % base != 0 ? 1 : 0);
//            byte[] temp = new byte[groups * base];
//            Arrays.fill(temp, (byte) 0);
//            System.arraycopy(keyByte, 0, temp, 0, keyByte.length);
//            keyByte = temp;
//        }
//        System.out.println("keyByte："+keyByte);
//        // 初始化
//        Security.addProvider(new BouncyCastleProvider());
//        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding", "BC");
//
//        System.out.println("cipher："+cipher);
//        SecretKeySpec spec = new SecretKeySpec(keyByte, "AES");
//        System.out.println("spec："+spec);
////        AlgorithmParameters parameters = AlgorithmParameters.getInstance("AES");
//        AlgorithmParameters parameters = AlgorithmParameters.getInstance("AES");
//
//        System.out.println("parameters："+parameters);
//        parameters.init(new IvParameterSpec(ivByte));
//        System.out.println("parameters："+parameters);
//        // 初始化
//        cipher.init(DECRYPT_MODE, spec, parameters);
//        System.out.println("cipher："+cipher);
//        System.out.println("cipher：78");
//        System.out.println("dataByte："+dataByte);
//        System.out.println("cipher.doFinal(dataByte)："+cipher.doFinal(dataByte));
//        byte[] resultByte = cipher.doFinal(dataByte);
//        System.out.println("resultByte："+resultByte);
//
//        if (null != resultByte && resultByte.length > 0) {
//            result = new String(resultByte, "UTF-8");
//            System.out.println("resultByte+"+resultByte);
//            System.out.println("result+"+result);
//        }
//    } catch (NoSuchAlgorithmException e) {
//        System.out.println("262");
////        log.error(e.getMessage(), e);
//    } catch (NoSuchPaddingException e) {
//        System.out.println("265");
////        LOGGER.error(e.getMessage(), e);
//    } catch (InvalidParameterSpecException e) {
//        System.out.println("268");
////        LOGGER.error(e.getMessage(), e);
//    } catch (IllegalBlockSizeException e) {
//        System.out.println("271");
////        LOGGER.error(e.getMessage(), e);
//    } catch (BadPaddingException e) {
//        System.out.println("273");
////        LOGGER.error(e.getMessage(), e);
//    } catch (UnsupportedEncodingException e) {
//        System.out.println("277");
////        LOGGER.error(e.getMessage(), e);
//    } catch (InvalidKeyException e) {
//        System.out.println("280");
////        LOGGER.error(e.getMessage(), e);
//    } catch (InvalidAlgorithmParameterException e) {
//        System.out.println("283");
////        LOGGER.error(e.getMessage(), e);
//    } catch (NoSuchProviderException e) {
//        System.out.println("286");
////        LOGGER.error(e.getMessage(), e);
//    }
//
//    System.out.println("result++:"+result);
//    return result;
//}



}